package com.yh.service.impl;

import com.alibaba.fastjson.JSON;
import com.yh.mapper.OrdersMapper;
import com.yh.model.Orders;
import com.yh.service.OrdersService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.List;
import java.util.concurrent.TimeUnit;

@Service
public class OrdersServiceImpl implements OrdersService {
    @Resource
    OrdersMapper ordersMapper;

    @Autowired
    RedisTemplate redisTemplate;

    @Override
    public List<Orders> findAll() {
        // 尝试从缓存中获取数据
        List<Orders> cachedOrders = (List<Orders>) redisTemplate.opsForValue().get("orders");
        if (cachedOrders == null) {
            // 如果缓存中没有数据，则从数据库中获取并缓存结果
            cachedOrders = ordersMapper.findAll();
            // 设置缓存过期时间
            redisTemplate.opsForValue().set("orders", cachedOrders, 1, TimeUnit.HOURS); // 缓存1小时
        }
        return cachedOrders;
    }

    /**
     * 根据订单号 查询订单详情( 商品 会员信息 游客信息)
     *
     * @param id
     * @return
     */
    @Override
    public Orders findById(Integer id) {
        //获取操作对象
        ValueOperations<String,String> ops = redisTemplate.opsForValue();
        // 查询缓存中是否有数据
        String v = ops.get("order_" + id);
        if (v != null) {
            // 有数据 直接返回
            return JSON.parseObject(v, Orders.class);
        }
        // 缓存中没有数据 查询数据库 并设置到缓存中
        Orders order = ordersMapper.findById(id);
        ops.set("order_" + id, JSON.toJSONString(order));
        return order;
    }

    /**
     * 新增订单
     *
     * @param orders
     */
    @Override
    public void save(Orders orders) {
        ordersMapper.insert(orders);
    }

    /**
     * 新增订单和游客的关系
     *
     * @param id          订单的主键
     * @param travellerId 游客id集合
     */
    @Override
    public void saveOrderAndTravellerRelation(String id, List<Integer> travellerId) {
        for (Integer tid : travellerId) {
            ordersMapper.saveOrderAndTravellerRelation(id, tid);
        }
    }

    /**
     * 根据主键删除
     *
     * @param id 订单id
     */
    @Override
    public void deleteById(Integer id) {
        // 先判断 该产品是否被外键关联
        // 查询: 根据订单id 去订单-游客表 查询出关联的 游客数量
        // 如果有 则不能删除 ; 没有 删除!
        Integer count = ordersMapper.findTravellerCountByOrderId(id);
        if (count == 0) {
            ordersMapper.deleteById(id);
        }
    }

    /**
     * 根据ids 批量删除
     *
     * @param ids
     */
    @Override
    public void selectDelete(Integer[] ids) {
        for (Integer id : ids) {
            deleteById(id);
        }
    }

    /**
     * 修改订单
     *
     * @param order
     */
    @Override
    public void edit(Orders order) {
        // 编辑订单的实现代码将在此处添加。
        ordersMapper.edit(order);
    }



}
